Міністерство освіти і науки
Національний університет “Львівська політехніка”
Кафедра ЕОМ
/
Звіт
з лабораторної роботи № 7
з дисципліни: “Основи алгоритмізації та програмування”
на тему: “Розв'язування на С задач, які використовують файли для вводу та виводу даних”
Мета лабораторної роботи
Познайомитися iз засобами файлового вводу та виводу в мовi програмування С.
Теоретичні відомості
Файловий ввід та вивід
З точки зору програми на мові С всі типи файлів при виконанні операцій вводу та виводу розглядаються як потік логічних даних незалежно від того чи програма читає (записує) символ чи байт, чи рядок даних, чи блок даних заданого розміру. Потоки в С можуть бути або текстовими потоками або бінарними потоками. При відкриванні файла з допомогою функції fopen( ) створює новий потік, який існує до тих пір доки не буде закритий з допомогою функції fclose( ). В мові С виконання операцій вводу-виводу делегується виконавчому середовищу (операційній системі) у якому виконується програма. Таким чином потік є каналом через який дані можуть передаватися з виконавчого середовища в програму чи з програми у виконавче середовище. Операції вводу-виводу з пристроями виконуються таким самим чином як і з файлами.
Текстовий потік транспортує символи тексту, які складаються з рядків (розділені на рядки). Рядки тексту складаються з послідовності символів, які завершуються символом нового рядка (керуючим символом). Рядок може бути і порожнім.
Бінарний потік є послідовністю байтів, які жодним чином не інтерпретуються і передаються без модифікації. У бінарному потоці не виділяють жодних керуючих символів. Дані записані в бінарний потік можуть бути знову прочитані у такими ж як були записані.
Файли в С представляються послідовністю байтів. Функція fopen( ) зв'язує файл з потоком і ініціалізує об'єкт типу FILE, який містить всю необхідну інформацію для управління потоком. Ця інформація включає вказівник на використовуваний буфер, індикатор поточної позиції у файлі та інші.
Функція fopen( ) повертає вказівник на об'єкт FILE потоку, який пов'язаний з відкритим файлом. Після відкриття файла з ним можна виконувати функції, які виконують читання-запис даних. Ці функції мають вказівник на об'єкт FILE як один із аргументів.
Прототип стандартної бібліотечної функції fopen( ) наступний
FILE *fopen( const char * filename, const char * mode );
Функція відкриває файл з іменем, який задається рядком filename. Параметр filename може містити і частину, яка специфікує каталог. Другий аргумент, mode, також є рядком і задає режим доступу. Цей аргумент вказує, які операції допустимі з файлом. Найважливішими є наступні значення цього аргументу:
"rb" - читання з бінарного потоку
"wb" - запис в бінарний потік
"rt" - читання з текстового потоку
"wt" - запис в текстовий потік
Для закривання фала використовується функція fclose( ). Її прототип:
int fclose( FILE *fp );
Функція скидає дані, якщо вони ще залишилися в буфері в файл, закриває файл і звільняє пам'ять, яку займали буфери вводу-виводу. Функція fclose( ) повертає нуль при успішному завершенні чи EOF, якщо станеться помилка.
Для читання символів використовується функція
int fgetc( FILE * fp );
Функція fgetc( ) читає символ з вхідного потоку на який посилається fp. Вона повертає прочитаний символ чи EOF, якщо станеться помилка.
Запис окремого символу в потік здійснюється з допомогою функції
int fputc( int c, FILE *fp );
Функція fputc( ) записує символ, який задається аргументом c у вихідний потік на який посилається fp. Вона повертає записаний символ чи EOF, якщо станеться помилка.
Читання рядка з потоку виконується функцією
char *fgets( char *buf, int n, FILE *fp );
Функція fgets( ) читає до n - 1 символів з вхідного потоку, на який посилається fp в буфер, який адресується buf, додаючи нуль-символ для завершення рядка. Якщо функція виявить символ нового рядка чи кінець файла перед тим як прочитає максимальну кількість символів, то лише вони будуть прочитані в буфе...